//
//  main.m
//  C05_函数
//
//  Created by dllo on 15/11/23.
//  Copyright © 2015年 dllo. All rights reserved.
//

#import <Foundation/Foundation.h>

#pragma mark - 知识点1 函数分类
/** 函数分库函数(系统提供的函数) 
 * 自定义函数(开发者自己编写的函数)
 */

/** 函数的语法
 * 返回值类型 函数名(形式参数列表){
           
             语句
             return 返回值   * 注意:返回值类型要和函数开头部分的返回值类型一致 *
    }
 */

/** 1.无返回值,无参数的函数 */
void printHello(){
    
    printf("Hello, world!");
    return;     /** 对于无返回值类型的函数,return通常省略.但是如果加上return, 是可以的. 但是return后面的语句不执行 */
    
}

/** 2.无返回值,有参数的函数 */
void printNumber(int x,int y){
    
    printf("%d%d", x, y);
}

/** 3.有返回值,无参数的函数 */
int numberTen(){
    
    printf("有返回值,无参数的函数");
    return 10;    /**< 对于有返回值类型的函数,必须有返回值,且类型要一致 */
}

/** 4.有返回值,有参数的函数 */
int sum(int x, int y){
    
    return x + y;
}

/** 练习 */
/** (1). 定义求两个整型数的最大值，并且把最大值返回给主调函数。 */
int max(int a,int b){
    if (a > b) {
        return a;
    } else {
        return b;
    }
}

/** (2). 定义求两个整型数的和，在该函数中打印和，不用把和返回给主调函数 */
void sumNumber(int a,int b){
    printf("sum = %d\n", a + b);
}

/** (3). 编写函数int sumValue(int n)：计算1到n的和 */
int sumValue(int n){
    int sum1 = 0;
    for (int i = 1; i <= n; i++) {
        sum1 = sum1 + i;
    }
    return sum1;
}

/** (4). 编写函数，返回正整数n中的数字的个数 */
int numberDigits(int n){
    int count = 0;
    do {
        count++;
    }
    while (n /= 10);
    return count;
}

#pragma mark - 知识点2 函数声明和定义

/** 函数的声明
 * 后面有 ; 号
 * 函数的声明,其中参数列表部分,参数名可以省略
 */
int min(int x,int y);
int min2(int, int);

/** 函数的实现(定义)
 * 函数的实现,其中参数列表部分,参数名必须有
 */
int min(int x,int y){
    return x < y ? x : y;
}

int min2(int x, int y){
    return x < y ? x : y;
}

void down();

/** 在工程中,通常是将函数的声明和实现单独放在不同的文件中,目的:解耦和查看方便.
 * 详见,"C05_2函数"工程
 */

#pragma mark - 知识点4 形参实参

/** 注意: 函数调用时, 形参会拷贝实参内容,单向传递,实参传给形参
 * 详见"C05_2函数" 工程 
 */

/** 练习:写一个交换两个整形变量值的函数, 详见"C05_2函数" 工程 */



#pragma mark - 知识点5 函数嵌套调用


/** 1，求两个数的最大值；
    2，求三个数的最大值；
    3，求四个数的最大值；
    4，求五个数的最大值；
 */
/** 详见"C05_2函数" 工程 */






#pragma mark - 主函数
int main(int argc, const char * argv[]) {
    
    
    
    
#pragma mark - 知识点3 函数调用
    /** 1.调用系统函数,printf() */
    printf("调用系统函数!\n");
    
    /** 2.调用自定义函数 */
    printHello();
    
    printNumber(3, 5);
    
    numberTen();
    int a = numberTen();
    printf("a = %d\n", a);
    printf("result = %d\n", numberTen());
    
    sum(3, 5);
    printf("sum = %d\n", sum(3, 5));
    
    max(3, 5);
    printf("max = %d\n", max(3, 5));
    
    sumNumber(2, 5);
    
    sumValue(5);
    printf("sum1 = %d\n", sumValue(5));
    
    numberDigits(12);
    printf("result = %d\n", numberDigits(12));
    
    down();
    
    

    
    
    
    
    
    
    
    
    return 0;
}

#pragma mark - 主函数的下方
void down(){
    printf("在主函数下方!\n");
}










